#include <stdio.h>

/*
 *  （1）字符串转换为对应整型数
 */
int atoi (char s []){
    int i , n;
    n = 0;
    for (i = 0; s[i] >= '0' && s[i] <= '9' ; ++i)
        n = n * 10 + (s[i] - '\0');
    return n;
}

/*
 *  （2）十六进制字符串转换为等价的整型值
 *  精髓全在 res = num + res * 16; 这句，如何构建一个n进制的数字？
 *  基本前提：第k位乘以n的k次方就行了
 *  方法1：从最高位或者最低位开始，每次维护一个flag作为n的k次方
 *  方法2：进位意味着原来的数字res向左挪动了一位，而这意味着要原来的数要乘以进制数字。 res*16
 *  与此同时，还需要再补充新家上的最低位数字num。 res*16 + num
 *  结论：计算和循环合在一起，从数字的角度解决问题，少维护了一个变量，很省事！学习了
 */

int htoi (char s []){
    int num = 0, res = 0;
    for (int i = 0; s[i] != '\0'; ++i) {
        if (s[i] >= '0' && s[i] <= '9')
            num = s[i] - '0';
        if (s[i] >= 'a' && s[i] <= 'f')
            num = s[i] - 'a' + 10;
        if (s[i] >= 'A' && s[i] <= 'F')
            num = s[i] - 'A' + 10;
        res = num + res * 16;
    }
    return res;
}

/*
 *  （3）strcat函数，将字符串t连接到字符串s的尾部
 *  也没啥好看的，估计还不如后面的呢，也就是下面那个表达式有点内容
 *      (s[i++] = t[j++]) != '\0'
 */
int strcat (char s [], char t[]){
    int i=0,j=0;
    while (s[i] != '\n')
        i++;
    while ((s[i++] = t[j++]) != '\0')
        ;
}

/*
 *  （4）getbits，返回x中从右边数第p位再往右边n位的段
 *      很有意思的位运算应用，可以练一下bitmask
 *
 *      细节：先通过(x >> (p+1-n))把要求的n位挪到最右边，p+1是因为是从0开始算的
 *      ~0是全1，<<n就变成1111100，再~就变成0000011，正好最低n位是1，高位都是0
 */
unsigned getbits (unsigned x, int p, int n){
    return (x >> (p+1-n)) & ~(~0 << n);
}

/* 2-6
 *  （5）setbits，从x第p位开始的n个二进制位，设置为y中最右边n位的值
 *      思路：把x的那些位都清零，再把y中除最右边b位意外都清零，然后左移到p位
 *          然后对这两个做or操作
 */
unsigned setbits (unsigned x, int p, int n, unsigned y){
    return  x & ~(~(~0 << n)  << (p+1-n)) |
           (y &   ~(~0 << n)) << (p+1-n);
}

/*
 *  invert，将x中从第p位开始的n个二进制位求反
 */
unsigned invert (unsigned x, int p, int n){
    return x ^ (~(~0 << n) << (p+1-n));
}

// rightrot 把x循环右移n位
unsigned rightrot (unsigned x, int n){

}



/* bitcount  就是为了学习 x&=(x-1)这个技巧而已，快速删除x最右边第一个二进制的1
 * 末尾是1：1-1变成0，0&1变成0，消除了最低的1位
 * 末尾是0：0-1向前借位，把最近的1借过来，这样10110000变成10101111，再&即消除原来末尾的1和x-1的后面多出来的1
 */
unsigned bitcount (unsigned x){
    int nb ;
    for( nb = 0; x&=(x-1); nb++)
        ;
    return nb;
}

int lower(int x){
    return ('A'<= x && x <= 'Z') ? x+32 : x;
}

int main() {
    int x = getchar();
    printf("%d \n",bitcount(x));
    return 0;
}
